// 应用配置文件
// 支持运行时配置、环境变量和默认配置三种方式，优先级：运行时配置 > 环境变量 > 默认配置

interface AppConfig {
  api: {
    baseUrl: string;
    timeout: number;
  };
  app: {
    name: string;
    version: string;
    environment: string;
  };
  features: {
    enableMockServer: boolean;
    enableAudioNotification: boolean;
  };
}

// 默认配置（开发环境）
const defaultConfig: AppConfig = {
  api: {
    baseUrl: 'http://localhost:3000/api/v1',
    timeout: 10000
  },
  app: {
    name: 'KZ DevOps',
    version: '1.0.0',
    environment: 'development'
  },
  features: {
    enableMockServer: true,
    enableAudioNotification: true
  }
};

// 从环境变量中读取配置
const getEnvConfig = (): Partial<AppConfig> => {
  // 在 Vite 中使用 import.meta.env 而不是 process.env
  const env = import.meta.env;
  
  return {
    api: {
      baseUrl: env.VITE_API_BASE_URL || defaultConfig.api.baseUrl,
      timeout: parseInt(env.VITE_API_TIMEOUT || defaultConfig.api.timeout.toString())
    },
    app: {
      name: env.VITE_APP_NAME || defaultConfig.app.name,
      version: env.VITE_APP_VERSION || defaultConfig.app.version,
      environment: (env.VITE_APP_ENV || defaultConfig.app.environment) as AppConfig['app']['environment']
    },
    features: {
      enableMockServer: env.VITE_ENABLE_MOCK_SERVER !== 'false',
      enableAudioNotification: env.VITE_ENABLE_AUDIO_NOTIFICATION !== 'false'
    }
  };
};

// 从运行时配置文件中读取配置
const loadRuntimeConfig = async (): Promise<Partial<AppConfig>> => {
  try {
    // 在生产环境中，配置文件位于public目录下
    // 环境配置：development/dev/DEV - 开发环境，staging - 测试环境，production - 生产环境
    // 开发环境会自动启用模拟服务器（当enableMockServer为true时）
    
    const response = await fetch('/config.json');
    if (response.ok) {
      const runtimeConfig = await response.json();
      return runtimeConfig;
    }
  } catch (error) {
    console.warn('无法加载运行时配置，使用环境变量和默认配置');
  }
  return {};
};

// 异步获取配置（包含运行时配置）
let cachedConfig: AppConfig | null = null;

export const getConfig = async (): Promise<AppConfig> => {
  if (cachedConfig) {
    return cachedConfig;
  }
  
  const runtimeConfig = await loadRuntimeConfig();
  const envConfig = getEnvConfig();
  
  cachedConfig = {
    api: {
      ...defaultConfig.api,
      ...envConfig.api,
      ...runtimeConfig.api
    },
    app: {
      ...defaultConfig.app,
      ...envConfig.app,
      ...runtimeConfig.app
    },
    features: {
      ...defaultConfig.features,
      ...envConfig.features,
      ...runtimeConfig.features
    }
  };
  
  return cachedConfig;
};

// 同步获取配置（用于不需要异步的场景）
export const getConfigSync = (): AppConfig => {
  if (cachedConfig) {
    return cachedConfig;
  }
  
  const envConfig = getEnvConfig();
  
  // 尝试同步加载运行时配置（如果可用）
  let runtimeConfig: Partial<AppConfig> = {};
  try {
    // 同步获取运行时配置（仅在生产环境或已缓存的配置中有效）
    if (typeof window !== 'undefined' && window.__RUNTIME_CONFIG__) {
      runtimeConfig = window.__RUNTIME_CONFIG__;
    }
  } catch (error) {
    console.warn('无法同步加载运行时配置');
  }
  
  return {
    api: {
      ...defaultConfig.api,
      ...envConfig.api,
      ...runtimeConfig.api
    },
    app: {
      ...defaultConfig.app,
      ...envConfig.app,
      ...runtimeConfig.app
    },
    features: {
      ...defaultConfig.features,
      ...envConfig.features,
      ...runtimeConfig.features
    }
  };
};

// 导出环境检测函数（同步版本）
export const isDevelopment = () => {
  const env = getConfigSync().app.environment.toLowerCase();
  return env === 'development' || env === 'dev' || env === 'development环境';
};
export const isStaging = () => getConfigSync().app.environment.toLowerCase() === 'staging';
export const isProduction = () => getConfigSync().app.environment.toLowerCase() === 'production';

// 导出API配置获取函数（异步版本）
export const getApiConfig = async () => (await getConfig()).api;
export const getApiBaseUrl = async () => (await getConfig()).api.baseUrl;
export const getApiTimeout = async () => (await getConfig()).api.timeout;

// 导出特性开关函数（同步版本）
export const shouldUseMockServer = () => 
  isDevelopment() && getConfigSync().features.enableMockServer;

export const shouldEnableAudioNotification = () => 
  getConfigSync().features.enableAudioNotification;